// 用户认证相关控制器
const axios = require("axios");
const User = require("../../models/User");
const Eat = require("../../models/Eat");
const Do = require("../../models/Do");
const DateModel = require("../../models/Date");

// 微信小程序配置
const appid = "wxd7d797edc9bd4e32";
const secret = "1185a90fcb9f6979931e2ff1d0a076a5";

// 开发模式开关（生产环境请设为 false）
const DEV_MODE = true;

/**
 * 用户登录
 */
async function login(req, res) {
  try {
    // 打印接收到的code，方便调试
    console.log('收到登录请求，code:', req.query.code);
    
    let session_key, openid;
    
    // 开发模式：使用模拟的openid
    if (DEV_MODE) {
      console.log('【开发模式】跳过微信登录验证');
      session_key = 'dev_session_key_' + Date.now();
      openid = 'dev_openid_' + Math.random().toString(36).substring(2);
      console.log('【开发模式】生成测试openid:', openid);
    } else {
      // 生产模式：调用微信接口获取 openid
      const wxUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${req.query.code}&grant_type=authorization_code`;
      console.log('调用微信接口:', wxUrl);
      
      const wxResponse = await axios.get(wxUrl);
      
      console.log('微信接口返回:', wxResponse.data);
      const { session_key: sk, openid: oid, errcode, errmsg } = wxResponse.data;

      // 检查微信接口是否返回错误
      if (errcode) {
        console.error('微信接口错误:', errcode, errmsg);
        return res.status(400).send({
          success: false,
          message: `微信登录失败: ${errmsg}`,
          errcode,
          wxResponse: wxResponse.data
        });
      }

      if (!oid) {
        return res.status(400).send({
          success: false,
          message: '获取openid失败'
        });
      }
      
      session_key = sk;
      openid = oid;
    }

    // 查找用户是否已存在
    let userInfo = await User.findOne({ openid });

    if (userInfo) {
      // 用户已存在，更新 session_key
      userInfo.session_key = session_key;
      await userInfo.save();
    } else {
      // 新用户，创建用户记录
      userInfo = await User.create({ session_key, openid });

      // 为新用户创建初始化数据（空数据，等待用户添加）
      const today = new Date().toISOString().split('T')[0]; // 今天的日期，格式：YYYY-MM-DD
      await Eat.create({
        openid,
        date: today, // 新的日期字段
        data: today, // 保留旧字段以兼容
        eat_score: 0,
        exercise: 1.37, // 默认中度运动
        breakfast: [],
        lunch: [],
        dinner: [],
        snacks: [],
        score: {
          calorie_target: 0,
          fat_target: 0,
          carbohydrate_target: 0,
          protein_target: 0,
          calorie_today: 0,
          fat_today: 0,
          carbohydrate_today: 0,
          protein_today: 0,
        },
      });
      
      // 同时在 Date 表中添加今天的日期记录
      try {
        await DateModel.create({
          openid,
          date: today,
        });
      } catch (err) {
        console.log('Date 记录创建失败（可能已存在）:', err.message);
      }

      await Do.create({
        openid,
        exercise: 5000,
        sport: [],
        score: {
          first_target: 5000,
          second_target: 4000,
          third_target: 6000,
          fourth_target: 6000,
          first_step: 0,
          second_step: 0,
          third_step: 0,
          fourth_step: 0,
          first_date: "",
          second_date: "",
          third_date: "",
          fourth_date: "",
        },
      });
    }

    // 返回用户信息
    res.send({
      success: true,
      data: userInfo,
      isNewUser: !userInfo.username // 如果没有用户名，说明是新用户需要完善信息
    });
  } catch (err) {
    console.error('登录错误:', err);
    res.status(400).send({
      success: false,
      message: err.message || '登录失败'
    });
  }
}

/**
 * 注册/更新用户信息
 */
async function register(req, res) {
  try {
    const { openid } = req.query;
    const { username, gender, age, height, weight, target } = req.body;

    // 验证 openid
    if (!openid) {
      return res.status(400).send({
        success: false,
        message: '缺少openid参数'
      });
    }

    // 验证必填字段
    if (!username || !username.trim()) {
      return res.status(400).send({
        success: false,
        message: '昵称不能为空'
      });
    }

    if (!age || age <= 0) {
      return res.status(400).send({
        success: false,
        message: '请输入有效年龄'
      });
    }

    if (!height || height <= 0) {
      return res.status(400).send({
        success: false,
        message: '请输入有效身高'
      });
    }

    if (!weight || weight <= 0) {
      return res.status(400).send({
        success: false,
        message: '请输入有效体重'
      });
    }

    // 查找用户
    let userInfo = await User.findOne({ openid });

    if (!userInfo) {
      return res.status(404).send({
        success: false,
        message: '用户不存在，请先登录'
      });
    }

    // 更新用户信息
    userInfo.username = username.trim();
    userInfo.gender = gender || 1;
    userInfo.age = age;
    userInfo.height = height;
    userInfo.weight = weight;
    userInfo.target = target || 0;

    await userInfo.save();

    // 返回更新后的用户信息
    res.send({
      success: true,
      message: '注册成功',
      data: userInfo
    });
  } catch (err) {
    console.error('注册错误:', err);
    res.status(400).send({
      success: false,
      message: err.message || '注册失败'
    });
  }
}

module.exports = {
  login,
  register
};

